<?php

require_once dirname(__FILE__) . '/../lib/ventasGeneratorConfiguration.class.php';
require_once dirname(__FILE__) . '/../lib/ventasGeneratorHelper.class.php';

/**
 * ventas actions.
 *
 * @package    tercermilenio
 * @subpackage ventas
 * @author     Your name here
 * @version    SVN: $Id: actions.class.php 12474 2008-10-31 10:41:27Z fabien $
 */
class ventasActions extends autoVentasActions {
    const CANT_MINIMA=1;
    const VTA_TIPO_DEFINITIVA = 1;
    const VTA_TIPO_CONDICIONAL = 2;

    public function executeJsFunctions() {
        
    }

    public function executeVerDetalle() {

        $this->ventas = $this->getRoute()->getObject();
        $this->form = $this->configuration->getForm($this->ventas);
        sfContext::getInstance()->getUser()->setAttribute('venta', null);
        $this->vtaId = $this->ventas->getVtaId();
        $vm = VentasManager::getInstance();

        $c = new Criteria();
        $c->add(DetalleVentasPeer::DET_VTA_VTA, $this->vtaId);
        $detalleVenta = DetalleVentasPeer::doSelect($c);
        foreach ($detalleVenta as $fila) {
            $producto = ProductosPeer::retrieveByPK($fila->getDetVtaArticulo(), $fila->getDetVtaTalle());
            if (!empty($producto)) {
                $cantidad = $fila->getDetVtaCantidad();
                $vm->cargarCarro($producto, $cantidad);
            }
        }

        $this->carro = sfContext::getInstance()->getUser()->getAttribute('venta');

        $this->total = null;
        $this->descuento = null;
        $this->subtotal = null;
        $this->total = null;
        $this->iva = null;

        //Obtener devoluciones de venta
        $criteria = new Criteria();
        $criteria->add(DevolucionesPeer::DEV_VENTA, $this->vtaId);
        $this->devoluciones = DevolucionesPeer::doSelect($criteria);

        if (!empty($this->carro)) {
            $this->descuento = $vm->getDescuento();
            $this->subtotal = $vm->getSubtotal();
            $this->total = $this->ventas->getTotal();
            $this->iva = $vm->getIva();
        }
    }

    protected function addSortCriteria($criteria) {
        if (array(null, null) == ($sort = $this->getSort())) {
            $criteria->addDescendingOrderByColumn(VentasPeer::VTA_FECHA);
            return;
        }

        if (($sort[0] != 'vta_cliente') && ($sort[0] != 'vta_tipo') && ($sort[0] != 'vta_usuario')) {
            $column = VentasPeer::translateFieldName($sort[0], BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_COLNAME);
        }

//Cliente
        if ($sort[0] == 'vta_cliente') {
            $criteria->addJoin(ClientesPeer::CLI_ID, VentasPeer::VTA_CLIENTE);
            $column = ClientesPeer::CLI_NOMBRE;
        }

//Tipo
        if ($sort[0] == 'vta_tipo') {
            $criteria->addJoin(TipoVentasPeer::TIP_VTA_ID, VentasPeer::VTA_TIPO);
            $column = TipoVentasPeer::TIP_VTA_NOMBRE;
        }
//Usuario
        if ($sort[0] == 'vta_usuario') {
            $criteria->addJoin(SfGuardUserPeer::ID, VentasPeer::VTA_USUARIO);
            $column = SfGuardUserPeer::USERNAME;
        }

        if ('asc' == $sort[1]) {
            $criteria->addAscendingOrderByColumn($column);
        } else {
            $criteria->addDescendingOrderByColumn($column);
        }
    }

    protected function buildCriteria() {
        $filterParams = $this->getFilters();

        if (is_null($this->filters)) {
            $this->filters = $this->configuration->getFilterForm($this->getFilters());
        } /* else {
          $filterParams = $this->getFilters();
          $filterDate = $filterParams['vta_fecha'];

          if (!empty($filterDate['from']) && !empty($filterDate['to'])) {

          $aDate = array();
          $aDate['from'] = explode('-', $filterDate['from']);
          list ($year, $month, $day) = $aDate['from'];

          $ansiDate = array();
          $ansiDate['from']['day'] = $day;
          $ansiDate['from']['month'] = $month;
          $ansiDate['from']['year'] = $year;
          $date['from'] = $day . '/' . $month . '/' . $year;

          $aDate['to'] = explode('-', $filterDate['to']);
          list ($year, $month, $day) = $aDate['to'];

          $ansiDate['to']['day'] = $day;
          $ansiDate['to']['month'] = $month;
          $ansiDate['to']['year'] = $year;
          $date['to'] = $day . '/' . $month . '/' . $year;
          //var_dump($date['to']);exit();
          $filterParams['vta_fecha'] = $date;

          $filterParams['vta_fecha']['from']->setAttribute('value', $date['from']);
          $filterParams['vta_fecha']['to']->setAttribute('value', $date['to']);
          }
          } */

        $criteria = $this->filters->buildCriteria($this->getFilters());

        $this->addSortCriteria($criteria);

        $event = $this->dispatcher->filter(new sfEvent($this, 'admin.build_criteria'), $criteria);
        $criteria = $event->getReturnValue();

        return $criteria;
    }

    public function executeIndex(sfWebRequest $request) {

        if ($this->getUser()->isAuthenticated()) {
// sorting
            if ($request->getParameter('sort') && $this->isValidSortColumn($request->getParameter('sort'))) {
                $this->setSort(array($request->getParameter('sort'), $request->getParameter('sort_type')));
            }

// pager
            if ($request->getParameter('page')) {
                $this->setPage($request->getParameter('page'));
            }

            $carro = sfContext::getInstance()->getUser()->setAttribute('venta', null);

            $this->pager = $this->getPager();
            $this->sort = $this->getSort();

            /*
              $filterParams = $this->getFilters();
              $filterDate = $filterParams['vta_fecha'];

              if (!empty($filterDate['from']) && !empty($filterDate['to'])) {

              $aDate = array();
              $aDate['from'] = explode('-', $filterDate['from']);
              list ($year, $month, $day) = $aDate['from'];

              $ansiDate = array();
              $ansiDate['from']['day'] = $day;
              $ansiDate['from']['month'] = $month;
              $ansiDate['from']['year'] = $year;
              $date['from'] = $day . '/' . $month . '/' . $year;

              $aDate['to'] = explode('-', $filterDate['to']);
              list ($year, $month, $day) = $aDate['to'];

              $ansiDate['to']['day'] = $day;
              $ansiDate['to']['month'] = $month;
              $ansiDate['to']['year'] = $year;
              $date['to'] = $day . '/' . $month . '/' . $year;
              //var_dump($date['to']);exit();
              $filterParams['vta_fecha'] = $date;

              //$filterParams['vta_fecha']['from']->setAttribute('value', $date['from']);
              //$filterParams['vta_fecha']['to']->setAttribute('value', $date['to']);

              //var_dump($filterParams);
              //exit();
              //$this->filters->getWidget('vta_fecha')->getOption('from_date')->setOption('default',$date['from']);
              //var_dump($this->filters->getWidget('vta_fecha')->getOption('from_date')->getAttributes());exit();//->getOption('to_date')->setDefault('to_date',$date['to']);

              }
             *
             */
        } else {
            $this->redirect('@sf_guard_signin');
        }
    }

    /**
     * Ejecuta la acción Nuevo del modulo Ventas
     * @author Maximiliano Vicente
     * @param sfWebRequest $request
     */
    public function executeNew(sfWebRequest $request) {

        $this->form = $this->configuration->getForm();
        $this->ventas = $this->form->getObject();
        sfContext::getInstance()->getUser()->setAttribute('venta', null);
    }

    /**
     *
     * @param sfWebRequest $request
     */
    public function executeEdit(sfWebRequest $request) {

        if ($request->hasParameter('edit')) {
            $this->edit = true;
        }

        sfContext::getInstance()->getUser()->setAttribute('venta', null);
//Objeto y form Compra
        $this->ventas = $this->getRoute()->getObject();
        $this->form = $this->configuration->getForm($this->ventas);
        sfContext::getInstance()->getUser()->setAttribute('venta', null);
        $this->vtaId = $this->ventas->getVtaId();
        $vm = VentasManager::getInstance();

        $c = new Criteria();
        $c->add(DetalleVentasPeer::DET_VTA_VTA, $this->vtaId);
        $detalleVenta = DetalleVentasPeer::doSelect($c);

        foreach ($detalleVenta as $fila) {
            $producto = ProductosPeer::retrieveByPK($fila->getDetVtaArticulo(), $fila->getDetVtaTalle());
            if (!empty($producto)) {


                $cantidad = $fila->getDetVtaCantidad();
                $vm->agregarProducto($producto, $cantidad);
            }
        }
    }

    public function executeDevolucion(sfWebRequest $request) {

//Objeto y form Compra
        $dm = DevolucionesManager::getInstance();

        if (!$request->hasParameter('vta')) {

            $this->ventas = $this->getRoute()->getObject();
            $this->form = $this->configuration->getForm($this->ventas);
            sfContext::getInstance()->getUser()->setAttribute('devolucion', null);
            $this->vtaId = $this->ventas->getVtaId();

//get detalle venta
            $detalleVenta = DetalleVentasPeer::obtenerDetallePorIdVenta($this->vtaId);

//cargar devolucion
            if (!empty($detalleVenta)) {
                foreach ($detalleVenta as $fila) {

                    $cantidad = $fila->getDetVtaCantidad();
                    $dm->cargarDevolucion($fila, $cantidad);
                }
            }
        } else {
            $this->vtaId = $request->getParameter('vta');
            $this->ventas = VentasPeer::retrieveByPK($this->vtaId);

            $this->form = $this->configuration->getForm($this->ventas);
        }

        if ($request->isMethod('post')) {

            $carro = $this->getUser()->getAttribute('devolucion');
            if (!empty($carro)) {
//Ventas
//comparar total pagocon total venta. Hacerlo en el checkout
                $totalDevolucion = $dm->getTotalDevolucion();
                $totalVenta = $dm->getTotalVenta($this->vtaId);

                if ($totalVenta != $totalDevolucion) {

                    $checkOut = $dm->checkOut($this->vtaId);
                    if ($checkOut) {
                        sfContext::getInstance()->getUser()->setFlash('notice', 'La devolución se ha registrado exitosamente.');
                        $this->redirect('ventas');
                    } else {
                        sfContext::getInstance()->getUser()->setFlash('error', 'No se ha podido concretar la devolución.');
                    }
                } else {

                    $this->getUser()->setFlash('error', 'No se han devuelto productos.');
                }
            } else {
                $this->getUser()->setFlash('error', 'No hay productos agregados a la venta.');
            }
//}
        }
//}
    }

    public function executeDetalleDevolucion(sfWebRequest $request) {

        if ($request->hasParameter('vta_id')) {
            $this->vtaId = $request->getParameter('vta_id');
        }
        if ($request->hasParameter('vta')) {
            $this->vtaId = $request->getParameter('vta');
        }

        $dm = DevolucionesManager::getInstance();

        if ($request->hasParameter('act')) {

            $articulo = $request->getParameter('pro_art');
            $talle = $request->getParameter('pro_tal');
            $action = $request->getParameter('act');

            $detalle = DetalleVentasPeer::retrieveByPK($articulo, $talle, $this->vtaId);

            if (!empty($detalle)) {
                if ($action == 'rec') {
                    $dm->recuperarProducto($detalle);
                } elseif ($action == 'dev') {
                    $dm->devolverCantProducto($detalle);
                } elseif ($action == 'all') {
                    $dm->devolverTodos($detalle);
                }
            } else {
                sfContext::getInstance()->getUser()->setFlash('notice', 'El producto no existe.');
            }
        }

        $carro = sfContext::getInstance()->getUser()->getAttribute('devolucion');

        if (!empty($carro)) {
            $this->carro = $carro;
            $this->totalVenta = $dm->getTotalVenta($this->vtaId);
            $this->totalDevolucion = $dm->getTotalDevolucion();
            $this->iva = 21.00; //$dm->getIva();
        }
    }

    /**
     *
     * @param sfWebRequest $request
     */
    public function executeBuscarProductos(sfWebRequest $request) {

        $params = $request->getParameterHolder()->getAll();
//form Busqueda de productos

        $formBusqueda = new BuscarProductosFormFilter();
        $paramFormBusqueda = $request->getParameter('productos_filters');
        if (!empty($paramFormBusqueda)) {
            if ($request->isMethod('post')) {

                $formBusqueda->bind($request->getParameter('productos_filters'));

                if ($formBusqueda->isValid()) {

                    $articulo = $formBusqueda->getValue('pro_articulo');
                    $talle = $formBusqueda->getValue('pro_talle');
                    $descripcion = $formBusqueda->getValue('pro_descripcion');

                    if (!empty($articulo) && !empty($talle) && !empty($descripcion)) {
                        $c = new Criteria();
                        $c->add(ProductosPeer::PRO_ARTICULO, '%' . $articulo['text'] . '%', Criteria::LIKE);
                        $c->add(ProductosPeer::PRO_TALLE, '%' . $talle['text'] . '%', Criteria::LIKE);
                        $c->add(ProductosPeer::PRO_DESCRIPCION, '%' . $descripcion['text'] . '%', Criteria::LIKE);
                        $this->productos = ProductosPeer::doSelect($c);
                    }
                }
            }
        }
        $this->formBusqueda = $formBusqueda;
    }

    public function executeGetCliente(sfWebRequest $request) {
        $cliente_id = $request->getParameter('cli_id');
        $this->cliente = ClientesPeer::retrieveByPk($cliente_id);
        $this->getResponse()->setContentType('text/javascript');
    }

    /**
     *
     * @param sfWebRequest $request
     */
    public function executeDetalleVenta(sfWebRequest $request) {

        $carro = sfContext::getInstance()->getUser()->getAttribute('venta');

        if ($request->hasParameter('vta_id')) {
            $this->vtaId = $request->getParameter('vta_id');
        }

        $vm = VentasManager::getInstance();

        if ($request->hasParameter('act')) {

            $articulo = $request->getParameter('pro_art');
            $talle = $request->getParameter('pro_tal');
            $action = $request->getParameter('act');

            $producto = ProductosPeer::retrieveByPK($articulo, $talle);

            if (!empty($producto)) {
                if ($action == 'add') {
                    $vm->agregarProducto($producto);
                    $this->disponibilidad = $vm->esDisponible($producto);
                } elseif ($action == 'del') {
                    $vm->eliminarCantProducto($producto);
                } elseif ($action == 'quit') {
                    $vm->eliminarProducto($producto);
                }
            } else {
                sfContext::getInstance()->getUser()->setFlash('notice', 'El producto no existe.');
            }
        }
        $carro = sfContext::getInstance()->getUser()->getAttribute('venta');

        if (!empty($carro)) {
            $this->carro = $carro["productos"];
            $this->descuento = $vm->getDescuento();
            $this->subtotal = $vm->getSubtotal();
            $this->precio_vta_con_descuento = $vm->getPrecioVentaConDescuento();
            $this->precio_vta_sin_descuento = $vm->getPrecioVentaSinDescuento();
            $this->iva = $vm->getIva();
        }
    }

    protected function processForm(sfWebRequest $request, sfForm $form) {
        $vm = VentasManager::getInstance();
        $error = false;

        $form->bind($request->getParameter($form->getName()), $request->getFiles($form->getName()));
        if ($form->isValid()) {

            $carro = $this->getUser()->getAttribute('venta');
            if (!empty($carro)) {

//Ventas
                $idCliente = $form->getValue('vta_cliente');
                $idVenta = $form->getValue('vta_id');
                $tipoVenta = $form->getValue('vta_tipo');

                //Formas de pago
                $efectivo = $form->getValue('efectivo');
                $precioEfectivo = $form->getValue('efectivo_importe');
                $cheque = $form->getValue('cheque');
                $precioCheque = $form->getValue('cheque_importe');
                $ctaCte = $form->getValue('cta_cte');
                $precioCtaCte = $form->getValue('cta_cte_importe');
                $tarjeta = $form->getValue('tarjeta');
                $precioTarjeta = $form->getValue('tarjeta_importe');
                $cuotasTarjeta = $form->getValue('tarjeta_cuotas');
                
                //Formas de Pago al carro
                if (( ($efectivo == "on" && !is_null($precioEfectivo)) || ($cheque == "on" && !is_null($precioCheque))
                        || ($ctaCte == "on" && !is_null($precioCtaCte)) || ($tarjeta == "on" && !is_null($precioTarjeta) && !is_null($cuotasTarjeta))
                        && $tipoVenta == self::VTA_TIPO_DEFINITIVA) || $tipoVenta == self::VTA_TIPO_CONDICIONAL) {

                    $vm->setFormasDePago($precioEfectivo, $precioCheque, $precioCtaCte, $precioTarjeta, $cuotasTarjeta);
                    //Calcular total de pago
                    $totalPago = $vm->getTotalFormaDePago($precioEfectivo, $precioCheque, $precioCtaCte, $precioTarjeta);
                    //comparar total pago con total venta. Hacerlo en el checkout
                    //$total = $vm->getPrecioFinal();
                    $pago = $vm->ComprobarPago();

                    if (($pago && $tipoVenta == self::VTA_TIPO_DEFINITIVA) || $tipoVenta == self::VTA_TIPO_CONDICIONAL) {
                        //Si ambos no coinciden, entonces no puede finalizar la compra con exito
                        //Checkout
                        $cliente = ClientesPeer::retrieveByPK($idCliente);

                        if (!empty($cliente)) {

                            //Comprobar que, en caso de pagar en cta cte, el monto de la venta + el existente
                            // sea menor al credito del cliente
                            if (!empty($precioCtaCte)) {

                                $credito = $cliente->getCliCredito();
                                $ctaCte = CuentasCorrientesPeer::retrieveByPK($cliente);
                                if (!empty($ctaCte)) {
                                    $deudaCtaCte = $ctaCte->getCtaCteDeuda();
                                } else {
                                    $deudaCtaCte = 0;
                                }

                                $montoDeuda = $deudaCtaCte + $precioCtaCte;
                                if ($montoDeuda > $credito) {
                                    $this->getUser()->setFlash(
                                            'error',
                                            'El monto adeudado por el cliente es mayor al crédito disponible.'
                                    );
                                    $error = true;
                                }
                            }

                            if (!$error) {
                                //AGREGAR TIPO VENTA Y FORMAS DE PAGO
                                $ventas = new Ventas();
                                $ventas->setIdClienteVenta($cliente->getCliId());
                                $ventas->setIdTipoVenta($tipoVenta);
                                $ventas->setIdVenta($idVenta);

                                if ($tipoVenta == sfConfig::get('app_venta_tipo_definitiva')) {
                                    $strategy = new VtaDefinitivaStrategy();
                                } else {
                                    $strategy = new VtaCondicionalStrategy();
                                }
                                $ventas->setStrategy($strategy);
                                $ventas->realizarVenta();

                                $this->getUser()->setFlash('notice', 'La venta se ha registrado exitosamente.');
                                $this->redirect('@ventas');
                            }
                        } else {
                            $error = true;
                            $this->getUser()->setFlash('error', 'El cliente no existe.');
                        }
                    } else {
                        $error = true;
                        sfContext::getInstance()->getUser()->setFlash('error', 'El total a pagar debe ser igual al total de la venta.');
                    }
                } else {
                    $this->getUser()->setFlash('error', 'Debe introducir una o más formas de pago.');
                    $error = true;
                }
            } else {
                $this->getUser()->setFlash('error', 'No hay productos agregados a la venta.');
                $error = true;
            }
            if (!empty($ventas)) {
                $this->dispatcher->notify(new sfEvent($this, 'admin.save_object', array('object' => $ventas)));
            }
        } else {
            $error = true;
            $this->getUser()->setFlash('error', 'The item has not been saved due to some errors.', false);
        }
    }

    public function executeFilter(sfWebRequest $request) {
        $firstpage = 1;
        $this->setPage($firstpage);

        if ($request->hasParameter('_reset')) {
            $this->setFilters($this->configuration->getFilterDefaults());

            $this->redirect('@ventas');
        }

        $this->filters = $this->configuration->getFilterForm($this->getFilters());

        $filterName = $this->filters->getName();
        $filterParams = $request->getParameter($filterName);

        $filterDate = $filterParams['vta_fecha'];
        if (!empty($filterDate['from']) && !empty($filterDate['to'])) {

            //$aDate = array();
            //$aDate['from'] = explode('/', $filterDate['from']);
            //list ($day, $month, $year) = $aDate['from'];
            //$ansiDate = array();
            //$ansiDate['from']['month'] = $month;
            //$ansiDate['from']['day'] = $day;
            //$ansiDate['from']['year'] = $year;
            //$aDate['to'] = explode('/', $filterDate['to']);
            //list ($day, $month, $year) = $aDate['to'];
            //$ansiDate['to']['month'] = $month;
            //$ansiDate['to']['day'] = $day;
            //$ansiDate['to']['year'] = $year;
            //$filterParams['vta_fecha'] = $ansiDate;
        }
//var_dump($filterDate['from']);exit();
        $this->filters->bind($filterParams);

        if ($this->filters->isValid()) {
            $this->setFilters($this->filters->getValues());
            $this->redirect('@ventas');
        }

        $this->pager = $this->getPager();
        $this->sort = $this->getSort();

        $this->setTemplate('index');
    }

    public function executeAutocompletarCliente($request) {
        $this->getResponse()->setContentType('application/json');
        $keywords = VentasPeer::autocompletarCliente($request->getParameter('q'), $request->getParameter('limit'));
        return $this->renderText(json_encode($keywords));
    }

    public function executeAutocompletarNombreCliente(sfWebRequest $request) {

        if ($request->hasParameter('cli_id')) {
            $cli_id = $request->getParameter('cli_id');
            $this->cliente = ClientesPeer::retrieveByPK($cli_id);
        }
    }

    public function executeGetClienteVenta(sfWebRequest $request) {
        //$this->redirect404If(!$request->hasParameter('cli_id'));
        $cli_id = $request->getParameter('cli_id');

        $this->cliente = ClientesPeer::retrieveByPK($cli_id);

        //var_dump($cli_id);exit();
    }

    public function executeVaciarCarro(sfWebRequest $request) {
        try {
            $vm = VentasManager::getInstance();
            $vm->vaciarCarro();
            $this->getUser()->setFlash('notice', 'Los productos de la venta han sido eliminados correctamente.');
        } catch (sfException $e) {
            $this->getUser()->setFlash('error', 'Los productos de la venta no han podido ser eliminados debido a algunos errores.');
        }
        
        $referer = $request->getReferer();
        $this->redirect($referer);
    }

}
